package com.xue.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.xue.util.RedisUtils;
import com.xue.util.redis.KeyPrefix;



/**
 * 
 * @ClassName: RedisService 
 * @Description: 处理redis缓存的存取
 * @author zzx
 *
 * @date 2020年1月7日
 */
@Service
public class RedisService {
	
	
	
	@Resource
    private RedisUtils redisUtil;
	
	/**
	 * 
	 * @Title: hget  
	 * @Description: 取缓存
	 * @param  <T>
	 * @param  key 
	 * @param  clazz 返回值类型
	 * @param     参数  
	 * @return T    返回类型  
	 * @throws  
	 * @author zzx
	 * @date 2020年1月7日
	 */
	public <T> T hget(String key, Class<T> clazz) {
		  Object obj = redisUtil.hget(key, ""+key);

		  T t = (T) obj;
          return t;
    }
	
	/**
	 * 
	 * @Title: hset  
	 * @Description: 存储对象 存储方式：set对象格式
	 * @param  <T>
	 * @param  key 缓存的key
	 * @param  value 缓存的值
	 * @param  time 缓存过期时间 -1代表永久有效，时间单位秒
	 * @param @return    参数  
	 * @return Boolean    返回类型  
	 * @throws  
	 * @author zzx
	 * @date 2020年1月7日
	 */
    public <T> Boolean hset(String key, T value , int time) {
    	boolean rbool = false;
        if (time <= 0) {
        	rbool = redisUtil.hset(key, ""+key, value);
        } else {
        	rbool = redisUtil.hset(key, ""+key, value, time);
        }
        return rbool;
    }
    
    /**
     * 
     * @Title: set  
     * @Description: 存储缓存 字符串格式
     * @param @param <T>
     * @param @param key
     * @param @param value
     * @param @param time 过期时间  -1 永久有效
     * @param @return    参数  
     * @return Boolean    返回类型  
     * @throws  
     * @author zzx
     * @date 2020年1月7日
     */
    public <T> Boolean set(String key, T value , int time) {
    	boolean rbool = false;
    	String str = beanToString(value);
    	if (str == null || str.length() <= 0) {
            return false;
        }    	
        if (time <= 0) {
        	rbool = redisUtil.set(key, str);
        } else {
        	rbool = redisUtil.set(key, str , time);
        }
    	return rbool;
    }
    /**
     * 
     * @Title: get  
     * @Description: 取缓存 
     * @param @param <T>
     * @param @param key
     * @param @param clazz
     * @param @return    参数  
     * @return T    返回类型  
     * @throws  
     * @author zzx
     * @date 2020年1月7日
     */
    public <T> T get(String key,  Class<T> clazz) {
    	String str = (String) redisUtil.get(key);
    	T t = stringToBean(str,clazz);    	
    	return t;
    }
    
    /**
     * 
     * @Title: getExpire  
     * @Description: 获取缓存过期时间
     * @param @param key
     * @return long    返回类型  
     * @throws  
     * @author zzx
     * @date 2020年1月7日
     */
    public long getExpire(String key) {
    		
    	long lnum = redisUtil.getExpire(key);
    	return lnum;
    }
    /**
     * 
     * @Title: setExpire  
     * @Description: 重新设置过期时间
     * @param @param key
     * @param @param time 时间（秒） -1代码永久有效
     * @param @return    参数  
     * @return boolean    返回类型  
     * @throws  
     * @author zzx
     * @date 2020年1月7日
     */
    public boolean setExpire(String key,long time) {
    	
    	return redisUtil.expire(key, time);
    }
	public static <T> String beanToString(T value) {
        if (value == null) {
            return null;
        }
        Class<?> clazz = value.getClass();
        if (clazz == int.class || clazz == Integer.class) {
            return String.valueOf(value);
        } else if (clazz == long.class || clazz == Long.class) {
            return String.valueOf(value);
        } else if (clazz == String.class) {
            return (String) value;
        } else {
            return JSON.toJSONString(value);
        }

    }

    public static <T> T stringToBean(String str, Class<T> clazz) {
        if (str == null || str.length() <= 0 || clazz == null) {
            return null;
        }
        if (clazz == int.class || clazz == Integer.class) {
            return (T) Integer.valueOf(str);
        } else if (clazz == long.class || clazz == Long.class) {
            return (T) Long.valueOf(str);
        } else if (clazz == String.class) {
            return (T) str;
        } else {
            return JSON.toJavaObject(JSON.parseObject(str), clazz);
        }
    }
	
}
